Error in odbcDriverConnect(paste0("driver={ODBC Driver 13 for SQL Server};",  : 
  could not find function "odbcDriverConnect"

First need to join up the real property data (Open Baltimore) the sales data (provided by Steve, and with deed dates from January 1, 2010 through October 2018) so we have a neighborhood for as many sales as we can.

1,153 sales didn’t match to a block-lot in the real property table, which means that the block-lot jointly was not in the real prop table.

Also, there are about 16,000 properties in the real prop table that don’t have a neighborhood.

So after joining we end up with 9,428 sales that don’t have a neighborhood.

The real property table also gives if it is principal residence or not, so we’ll also filter for the sales that are for principal residences.

Distribution of city-wide 2018 sales prices:

   85% 
275000 

Bring in permit data

Observations: 836,816
Variables: 45
$ ID_Permit        <int> 375642224, 375642225, 375642226, 375642227, 37...
$ csm_caseno       <fct> 000000001, 000000002, 000000003, 000000004, 00...
$ csm_plan_year    <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_plans_number <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_description  <fct> issued through building inspection, install ga...
$ csm_expr_date    <dttm> 1994-06-06, 1994-06-04, 1993-06-06, 1994-06-0...
$ csm_finaled_date <dttm> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
$ csm_issued_date  <dttm> 1993-09-30, 1993-06-14, 1993-06-14, 1993-06-1...
$ csm_name_first   <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_name_last    <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_name_mi      <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_projname     <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_recd_by      <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_recd_date    <dttm> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
$ csm_status       <fct> EXP, EXP, EXP, EXP, EXP, EXP, EXP, EXP, EXP, E...
$ csm_frozen       <fct> N, N, N, N, N, N, N, N, N, N, F, N, N, N, N, N...
$ csm_auto_cond    <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_updateby     <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_updated      <dttm> 2005-08-07, 2005-08-07, 2005-08-07, 2005-08-0...
$ csm_projno       <fct> 000000001, 000000002, 000000003, 000000004, 00...
$ prc_avp_no       <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
$ csm_target_date  <dttm> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
$ case_type        <fct> COM, COM, COM, COM, COM, COM, COM, COM, COM, C...
$ PLANADDRESS      <fct> 0000 COUNTER, 1067 CAMERON ROAD, 4266 CLYDESDA...
$ prc_parcel_no    <fct> 9948 948, 5142 034, 3575C010, 5164 022, 3355 0...
$ com_type_work    <fct> OTH, OTH, AA, OTH, OTH, OTH, OTH, OTH, OTH, AA...
$ com_sprinklers   <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ com_existing_use <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_type_work    <fct> OTH, OTH, AA, OTH, OTH, OTH, OTH, OTH, OTH, AA...
$ csm_use          <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ PlansNum         <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ csm_st_name      <fct> COUNTER, CAMERON ROAD, CLYDESDALE AVE, KENILWO...
$ csm_st_number    <fct> 0000, 1067, 4266, 5313, 2518, 4217, 3527, 0720...
$ csm_st_pfx       <fct> NA, NA, NA, NA, NA, NA, NA, NA, E, NA, NA, NA,...
$ prc_block_no     <fct> 9948 , 5142, 3575C, 5164, 3355, 5749, 5555, 76...
$ prc_lot          <fct> 948, 034, 010, 022, 010, 017, 194, 036, 048, 0...
$ prc_neighborhood <fct> NA, CAMERON VILLAGE, MEDFIELD, KENILWORTH PARK...
$ PlanURL          <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ prc_hi_dist      <int> NA, 570, 540, 570, 672, 480, 470, 980, 551, 62...
$ csm_cost         <dbl> 0, 2000, 2290, 1400, 6600, 5800, 4500, 5350, 7...
$ csm_mastno       <fct> 000000001, 000000002, 000000003, 000000004, 00...
$ BlockLot         <fct> 9948 948, 5142034, 3575C010, 5164022, 3355010,...
$ csm_id           <fct> 200243175721, 200243175722, 200243175723, 2002...
$ Applicant        <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ Lessee           <fct> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...

Neighborhood Summary Table, 2015-2017

We have 16110 samples to work with that are in 2015-2017, have a neighborhood, were an arms-length sale, and are the principal residence.

Which neighborhoods have less than 20 sales meeting the criteria?

84 neighborhoods have less than 20 sales meeting the criteria. We’ll exclude them going forward so we have a reasonable sample size.

98th Percentile

Criteria & Results

There are 167 sales that meet the following criteria:

  • Deed date was between January 1, 2018 and October 5, 2018
  • Arms-length sale
  • Principal residence
  • Neighborhood had at least 20 sales
  • 98th percentile for sales prices for their neighborhood.

(If this yield isn’t high enough we can bump it down to the 95th percentile.)

Map

Full list

Detect jumps

99th Percentile

Criteria & Results

There are 167 sales that meet the following criteria:

  • Deed date was between January 1, 2018 and October 5, 2018
  • Arms-length sale
  • Principal residence
  • Neighborhood had at least 20 sales
  • 99th percentile for sales prices for their neighborhood.

(If this yield isn’t high enough we can bump it down to the 95th percentile.)

Map

In Middle Neighborhood, 99th Percentile for Neighborhood, Over $250k, Over $10k Permit Activity

The following criteria are used below:

[1] 45

Further filter for permit value totals over $10,000.

Results in 27 properties.

[1] 27

Full List

MRIS data Nov 2018 - February 2019

Observations: 2,189
Variables: 24
$ Address                                                                                <chr> "10 E...
$ Zip_Code                                                                               <dbl> 21202...
$ Close_Date                                                                             <dttm> 2019...
$ Ownership                                                                              <chr> "Cond...
$ Type                                                                                   <chr> "Pent...
$ Townhouse_Type                                                                         <chr> "Cont...
$ List_Price                                                                             <dbl> 11000...
$ Close_Price                                                                            <dbl> 11000...
$ Transaction_Type                                                                       <chr> "Stan...
$ Year_Built                                                                             <dbl> 1989,...
$ Bedrooms                                                                               <dbl> 3, 3,...
$ Baths_Full                                                                             <dbl> 4, 2,...
$ Baths_Half                                                                             <dbl> 1, 1,...
$ New_Construction                                                                       <chr> "No",...
$ Year_Renovated                                                                         <dbl> NA, N...
$ Total_Assessment                                                                       <dbl> 15093...
$ Original_List_Price                                                                    <dbl> 11000...
$ New_Trust_Loan_Type                                                                    <chr> "Cash...
$ Neighborhood                                                                           <chr> "Otte...
$ `Sales Price to Original List Price Ratio\r\n(Close Price divided by Orig List Price)` <dbl> 1.000...
$ `2017 Housing Market Typology: Predominant`                                            <chr> "A", ...
$ X__1                                                                                   <lgl> NA, N...
$ `N'hood 2018 Average`                                                                  <dbl> 39719...
$ `N'hood 2018 Median`                                                                   <dbl> 38900...
LS0tDQp0aXRsZTogIlJlY2VudCBTYWxlcyBPdXRsaWVycyINCmF1dGhvcjogIkp1c3RpbiBFbHN6YXN6LCBNYXlvcidzIE9mZmljZSBvZiBJbm5vdmF0aW9uIg0KZW1haWw6ICJqdXN0aW4uZWxzemFzekBiYWx0aW1vcmVjaXR5LmdvdiINCmRhdGU6ICJUaHVyc2RheSwgRmVicnVhcnkgMjgsIDIwMTkiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgZmlnX2hlaWdodDogNQ0KICAgIGZpZ193aWR0aDogMTANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogMg0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0UsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBjYWNoZSA9IFRSVUV9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRiwgbWVzc2FnZSA9IEYsIGluY2x1ZGUgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA1KQ0KYGBgDQoNCg0KYGBge3J9DQpzb3VyY2UoIi4uL3NyYy8wMF9pbml0aWFsaXplLlIiKQ0Kc2FsZXMgPC0gbG9hZF9zYWxlc19kYXRhKGxvYWQuY2FjaGUgPSBUKQ0KDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoUlNvY3JhdGEpDQpsaWJyYXJ5KHNwKQ0KbGlicmFyeShsZWFmbGV0KQ0KbGlicmFyeShST0RCQykNCmxpYnJhcnkoaHRtbHRvb2xzKQ0KDQpyZWFsLnByb3AudXJsIDwtICJodHRwczovL2RhdGEuYmFsdGltb3JlY2l0eS5nb3YvcmVzb3VyY2UvNmFjdC1xenV5Lmpzb24iDQpyZWFsLnByb3AgPC0gcmVhZC5zb2NyYXRhKHJlYWwucHJvcC51cmwsIGFwcF90b2tlbiA9IFZBUlMkU09DUkFUQV9UT0tFTikNCg0KaG9vZHMgPC0gZ2V0X25laWdoYm9yaG9vZF9ib3VuZGFyaWVzKCkNCmhtdCA8LSBsb2FkX2Jsb2NrX2dyb3VwX2RhdGEobG9hZC5jYWNoZSA9IFQpDQpobXQuaG9vZCA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhL3Jhdy9obXQvSE1UIGJ5IE5laWdoYm9yaG9vZCAyMDE3Lnhsc3giKQ0KDQpjb25uLmdpcyA8LSBvZGJjRHJpdmVyQ29ubmVjdCgNCiAgcGFzdGUwKA0KICAgICdkcml2ZXI9e09EQkMgRHJpdmVyIDEzIGZvciBTUUwgU2VydmVyfTsnLA0KICAgICdzZXJ2ZXI9JywgVkFSUyRFR0lTX1NFUlZFUiwgDQogICAgJzt1aWQ9JywgVkFSUyRFR0lTX1NFUlZFUl9VU0VSLA0KICAgICc7cHdkPScsVkFSUyRFR0lTX1NFUlZFUl9QV0QsIA0KICAgICc7ZGF0YWJhc2U9aG91c2luZzt0cnVzdGVkX2Nvbm5lY3Rpb249Tm8nKQ0KKQ0KDQpwZXJtaXRzIDwtIHNxbEZldGNoKGNvbm4uZ2lzLCAiaG91c2luZy50YmxfUGVybWl0IikNCg0KbXJpcy5yZWNlbnQgPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9yYXcvc2FsZXMvTm92IDIwMTggLSBGZWIgMjAxOSBzYWxlcyBmb3IgSnVzdGluLnhsc3giKQ0KYGBgDQoNCkZpcnN0IG5lZWQgdG8gam9pbiB1cCB0aGUgcmVhbCBwcm9wZXJ0eSBkYXRhIChbT3BlbiBCYWx0aW1vcmVdKFtodHRwOi8vZGF0YS5iYWx0aW1vcmVjaXR5Lmdvdi9GaW5hbmNpYWwvUmVhbC1Qcm9wZXJ0eS1UYXhlcy8yN3c5LXVydHZ0bykpIHRoZSBzYWxlcyBkYXRhIChwcm92aWRlZCBieSBTdGV2ZSwgYW5kIHdpdGggKipkZWVkIGRhdGVzIGZyb20gSmFudWFyeSAxLCAyMDEwIHRocm91Z2ggT2N0b2JlciAyMDE4KiopIHNvIHdlIGhhdmUgYSBuZWlnaGJvcmhvb2QgZm9yIGFzIG1hbnkgc2FsZXMgYXMgd2UgY2FuLg0KDQpgYGB7cn0NCnNhbGVzIDwtIHNhbGVzICU+JSByZW5hbWUoc2FsZXMuYmxvY2sgPSBCbG9jaywgc2FsZXMubG90ID0gTG90KQ0KcmVhbC5wcm9wIDwtIHJlYWwucHJvcCAlPiUgcmVuYW1lKHJlYWwuYmxvY2sgPSBibG9jaywgcmVhbC5sb3QgPSBsb3QpDQpgYGANCg0KYGBge3J9DQpyZWFsLnByb3AgPC0gcmVhbC5wcm9wICU+JQ0KICBtdXRhdGUocmVhbC5ibG9jay5jbGVhbiA9IGdzdWIoIl4wKyIsICIiLCByZWFsLmJsb2NrKSwNCiAgICAgICAgIHJlYWwubG90LmNsZWFuID0gZ3N1YigiXjArIiwgIiIsIHJlYWwubG90KSkNCg0Kc2FsZXMgPC0gc2FsZXMgJT4lDQogIG11dGF0ZShzYWxlcy5ibG9jay5jbGVhbiA9IGdzdWIoIl4wKyIsICIiLCBzYWxlcy5ibG9jayksDQogICAgICAgICBzYWxlcy5sb3QuY2xlYW4gPSBnc3ViKCJeMCsiLCAiIiwgc2FsZXMubG90KSkNCmBgYA0KDQpgYGB7cn0NCnNhbGVzIDwtIHNhbGVzICU+JQ0KICBsZWZ0X2pvaW4ocmVhbC5wcm9wLCANCiAgICAgICAgICAgIGJ5ID0gYygic2FsZXMuYmxvY2suY2xlYW4iID0gInJlYWwuYmxvY2suY2xlYW4iLA0KICAgICAgICAgICAgICAgICAgICJzYWxlcy5sb3QuY2xlYW4iID0gInJlYWwubG90LmNsZWFuIikNCiAgICAgICAgICAgICkNCmBgYA0KDQpgYGB7cn0NCnNhbGVzICU+JSBjb3VudChpcy5uYShyZWFsLmJsb2NrKSwgaXMubmEocmVhbC5sb3QpKQ0KYGBgDQoNCjEsMTUzIHNhbGVzIGRpZG4ndCBtYXRjaCB0byBhIGJsb2NrLWxvdCBpbiB0aGUgcmVhbCBwcm9wZXJ0eSB0YWJsZSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgYmxvY2stbG90IGpvaW50bHkgd2FzIG5vdCBpbiB0aGUgcmVhbCBwcm9wIHRhYmxlLiANCg0KQWxzbywgdGhlcmUgYXJlIGFib3V0IDE2LDAwMCBwcm9wZXJ0aWVzIGluIHRoZSByZWFsIHByb3AgdGFibGUgdGhhdCBkb24ndCBoYXZlIGEgbmVpZ2hib3Job29kLiANCg0KYGBge3J9DQpyZWFsLnByb3AgJT4lIGNvdW50KGlzLm5hKG5laWdoYm9yaG9vZCkpDQpgYGANCg0KU28gYWZ0ZXIgam9pbmluZyB3ZSBlbmQgdXAgd2l0aCA5LDQyOCBzYWxlcyB0aGF0IGRvbid0IGhhdmUgYSBuZWlnaGJvcmhvb2QuDQoNCmBgYHtyfQ0Kc2FsZXMgJT4lIGNvdW50KCFpcy5uYShuZWlnaGJvcmhvb2QpKQ0KYGBgDQoNClRoZSByZWFsIHByb3BlcnR5IHRhYmxlIGFsc28gZ2l2ZXMgaWYgaXQgaXMgcHJpbmNpcGFsIHJlc2lkZW5jZSBvciBub3QsIHNvIHdlJ2xsIGFsc28gZmlsdGVyIGZvciB0aGUgc2FsZXMgdGhhdCBhcmUgZm9yIHByaW5jaXBhbCByZXNpZGVuY2VzLg0KDQpgYGB7cn0NCnNhbGVzICU+JSBjb3VudChyZXNjb2RlKQ0KYGBgDQoNCkRpc3RyaWJ1dGlvbiBvZiBjaXR5LXdpZGUgMjAxOCBzYWxlcyBwcmljZXM6DQoNCmBgYHtyfQ0Kc2FsZXMgJT4lDQogIGZpbHRlcih5ZWFyKGRlZWQuZGF0ZSkgPT0gMjAxOCkgJT4lDQogIGdncGxvdChhZXMoYFNhbGVzIFByaWNlYCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oKSArDQogIHRoZW1lX2l0ZWFtX2dvb2dsZV9kb2NzKCkgKw0KICB4bGltKGMoMCwgNTAwMDAwKSkNCmBgYA0KDQpgYGB7cn0NCnF1YW50aWxlKHNhbGVzJGBTYWxlcyBQcmljZWAsIDAuODUpDQpgYGANCiANCiMgQnJpbmcgaW4gcGVybWl0IGRhdGENCg0KYGBge3J9DQpwZXJtaXRzICU+JSBnbGltcHNlKCkNCmBgYA0KDQpgYGB7cn0NCnBlcm1pdHMgJT4lIGNvdW50KGNzbV9zdGF0dXMpDQpgYGANCg0KYGBge3J9DQpwZXJtaXRzICU+JSBjb3VudChjc21fdHlwZV93b3JrKQ0KYGBgDQoNCiMgTmVpZ2hib3Job29kIFN1bW1hcnkgVGFibGUsIDIwMTUtMjAxNw0KDQpgYGB7cn0NCm1lZXQuY3JpdGVyaWEgPC0gc2FsZXMgJT4lDQogIGZpbHRlcih5ZWFyKGRlZWQuZGF0ZSkgJWluJSBjKDIwMTUsIDIwMTYsIDIwMTcpLA0KICAgICAgICAgIWlzLm5hKG5laWdoYm9yaG9vZCksDQogICAgICAgICBgSG93IENvbnZleWVkYCA9PSAxLA0KICAgICAgICAgIWdyZXBsKCJOT1QiLCByZXNjb2RlKSkgJT4lDQogIG5yb3cNCmBgYA0KDQpXZSBoYXZlIGByIG1lZXQuY3JpdGVyaWFgIHNhbXBsZXMgdG8gd29yayB3aXRoIHRoYXQgYXJlIGluIDIwMTUtMjAxNywgaGF2ZSBhIG5laWdoYm9yaG9vZCwgd2VyZSBhbiBhcm1zLWxlbmd0aCBzYWxlLCBhbmQgYXJlIHRoZSBwcmluY2lwYWwgcmVzaWRlbmNlLg0KDQpgYGB7cn0NCnNhbGVzLnN1bW1hcnkuMTVfMTcuYnkuaG9vZCA8LSBzYWxlcyAlPiUNCiAgZmlsdGVyKHllYXIoZGVlZC5kYXRlKSAlaW4lIGMoMjAxNSwgMjAxNiwgMjAxNyksDQogICAgICAgICAhaXMubmEobmVpZ2hib3Job29kKSwNCiAgICAgICAgIGBIb3cgQ29udmV5ZWRgID09IDEsDQogICAgICAgICAhZ3JlcGwoIk5PVCIsIHJlc2NvZGUpKSAlPiUNCiAgZ3JvdXBfYnkobmVpZ2hib3Job29kKSAlPiUNCiAgc3VtbWFyaXNlKGhvb2QubiA9IG4oKSwNCiAgICAgICAgICAgIGhvb2QubWVhbiA9IG1lYW4oYFNhbGVzIFByaWNlYCksDQogICAgICAgICAgICBob29kLm1lZGlhbiA9IG1lZGlhbihgU2FsZXMgUHJpY2VgKSwNCiAgICAgICAgICAgIGhvb2Quc3RkID0gc3FydChzdW0oKGBTYWxlcyBQcmljZWAtaG9vZC5tZWFuKV4yLyhob29kLm4tMSkpKSwNCiAgICAgICAgICAgIGhvb2QuOTV0aCA9IHF1YW50aWxlKGBTYWxlcyBQcmljZWAsIHByb2JzID0gLjk1KSwNCiAgICAgICAgICAgIGhvb2QuOTh0aCA9IHF1YW50aWxlKGBTYWxlcyBQcmljZWAsIHByb2JzID0gLjk4KSwNCiAgICAgICAgICAgIGhvb2QuOTl0aCA9IHF1YW50aWxlKGBTYWxlcyBQcmljZWAsIHByb2JzID0gLjk5KSkNCg0Kc2FsZXMuc3VtbWFyeS4xNV8xNy5ieS5ob29kICANCmBgYA0KDQpXaGljaCBuZWlnaGJvcmhvb2RzIGhhdmUgbGVzcyB0aGFuIDIwIHNhbGVzIG1lZXRpbmcgdGhlIGNyaXRlcmlhPw0KDQpgYGB7cn0NCnNhbGVzLnN1bW1hcnkuMTVfMTcuYnkuaG9vZCAlPiUNCiAgZmlsdGVyKGhvb2QubiA8IDIwKQ0KYGBgDQoNCjg0IG5laWdoYm9yaG9vZHMgaGF2ZSBsZXNzIHRoYW4gMjAgc2FsZXMgbWVldGluZyB0aGUgY3JpdGVyaWEuIFdlJ2xsIGV4Y2x1ZGUgdGhlbSBnb2luZyBmb3J3YXJkIHNvIHdlIGhhdmUgYSByZWFzb25hYmxlIHNhbXBsZSBzaXplLg0KDQpgYGB7cn0NCiMgSm9pbiB0aGUgc3VtbWFyaWVzIHRvIHRoZSBuZWlnaGJvcmhvb2QgYm91bmRhcmllcw0KaG9vZHNAZGF0YSA8LSBob29kc0BkYXRhICU+JSANCiAgbGVmdF9qb2luKHNhbGVzLnN1bW1hcnkuMTVfMTcuYnkuaG9vZCwNCiAgICAgICAgICAgIGJ5ID0gYygibGFiZWwiID0gIm5laWdoYm9yaG9vZCIpKQ0KYGBgDQoNCg0KIyA5OHRoIFBlcmNlbnRpbGUNCg0KIyMgQ3JpdGVyaWEgJiBSZXN1bHRzDQoNCmBgYHtyfQ0Kc2FsZXMuaG9vZC45OHRoIDwtIHNhbGVzICU+JQ0KICBsZWZ0X2pvaW4oc2FsZXMuc3VtbWFyeS4xNV8xNy5ieS5ob29kLA0KICAgICAgICAgICAgYnkgPSBjKCJuZWlnaGJvcmhvb2QiID0gIm5laWdoYm9yaG9vZCIpKSAlPiUNCiAgZmlsdGVyKHllYXIoZGVlZC5kYXRlKSA9PSAyMDE4LA0KICAgICAgICAgaG9vZC5uID49IDIwLA0KICAgICAgICAgYFNhbGVzIFByaWNlYCA+PSBob29kLjk4dGgsDQogICAgICAgICBgSG93IENvbnZleWVkYCA9PSAxLA0KICAgICAgICAgIWdyZXBsKCJOT1QiLCByZXNjb2RlKSkgJT4lDQogIGFycmFuZ2UobmVpZ2hib3Job29kKQ0KDQpyZXN1bHQuc2FsZXMgPC0gbnJvdyhzYWxlcy5ob29kLjk4dGgpDQpgYGANCg0KKipUaGVyZSBhcmUgYHIgcmVzdWx0LnNhbGVzYCBzYWxlcyB0aGF0IG1lZXQgdGhlIGZvbGxvd2luZyBjcml0ZXJpYToqKg0KDQotIERlZWQgZGF0ZSB3YXMgYmV0d2VlbiBKYW51YXJ5IDEsIDIwMTggYW5kIE9jdG9iZXIgNSwgMjAxOA0KLSBBcm1zLWxlbmd0aCBzYWxlDQotIFByaW5jaXBhbCByZXNpZGVuY2UNCi0gTmVpZ2hib3Job29kIGhhZCBhdCBsZWFzdCAyMCBzYWxlcw0KLSA5OHRoIHBlcmNlbnRpbGUgZm9yIHNhbGVzIHByaWNlcyBmb3IgdGhlaXIgbmVpZ2hib3Job29kLg0KDQooSWYgdGhpcyB5aWVsZCBpc24ndCBoaWdoIGVub3VnaCB3ZSBjYW4gYnVtcCBpdCBkb3duIHRvIHRoZSA5NXRoIHBlcmNlbnRpbGUuKQ0KDQoNCmBgYHtyfQ0Kc2FsZXMuaG9vZC45OHRoJGxvbmcgPC0gbGFwcGx5KHNhbGVzLmhvb2QuOTh0aCRsb2NhdGlvbi5jb29yZGluYXRlcywgZnVuY3Rpb24oeCkgeFsxXSkgJT4lIHVubGlzdCgpDQoNCnNhbGVzLmhvb2QuOTh0aCRsYXQgPC0gbGFwcGx5KHNhbGVzLmhvb2QuOTh0aCRsb2NhdGlvbi5jb29yZGluYXRlcywgZnVuY3Rpb24oeCkgeFsyXSkgJT4lIHVubGlzdCgpDQpgYGANCg0KDQpgYGB7cn0NCnNhbGVzLmhvb2QuOTh0aC5nZW8gPC0gc2FsZXMuaG9vZC45OHRoICU+JSBmaWx0ZXIoIWlzLm5hKGxvbmcpKQ0KICANCnNhbGVzLmhvb2QuOTh0aC5nZW8gPC0gU3BhdGlhbFBvaW50c0RhdGFGcmFtZSgNCiAgc2FsZXMuaG9vZC45OHRoLmdlbyAlPiUgc2VsZWN0KGxvbmcsIGxhdCksIA0KICBzYWxlcy5ob29kLjk4dGguZ2VvLA0KICBwcm9qNHN0cmluZyA9IENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK25vX2RlZnMgK2VsbHBzPVdHUzg0ICt0b3dnczg0PTAsMCwwIikpDQoNCnNhbGVzLmhvb2QuOTh0aC5nZW8gPC0gDQogIHNwVHJhbnNmb3JtKA0KICAgIHNhbGVzLmhvb2QuOTh0aC5nZW8sIA0KICAgIENSU29iaiA9IENSUygiK2luaXQ9ZXBzZzo0MzI2ICtwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0ICtub19kZWZzICtlbGxwcz1XR1M4NCArdG93Z3M4ND0wLDAsMCIpDQogICAgKQ0KDQpgYGANCg0KIyMgTWFwDQoNCmBgYHtyfQ0KbGlicmFyeShodG1sdG9vbHMpDQoNCmhvb2RzLmxhYmVscyA8LSBwYXN0ZTAoDQogIGhvb2RzJGxhYmVsLA0KICAiPGJyPk1lZGlhbiBTYWxlcywgMjAxNS0yMDE3OiAiLCBhcy5jaGFyYWN0ZXIoaG9vZHMkaG9vZC5tZWRpYW4pDQogIA0KKQ0KDQpzYWxlLmxhYmVscyA8LSBwYXN0ZTAoDQogIHNhbGVzLmhvb2QuOTh0aC5nZW8kYEhvdXNlICNgLCAiICIsDQogIHNhbGVzLmhvb2QuOTh0aC5nZW8kYFN0cmVldCBOYW1lYCwgIiAiLA0KICBzYWxlcy5ob29kLjk4dGguZ2VvJFN1ZmZpeCwgDQogICI8YnI+U2FsZSBQcmljZSBpbiAyMDE4OiAiLCANCiAgYXMuY2hhcmFjdGVyKHNhbGVzLmhvb2QuOTh0aC5nZW8kYFNhbGVzIFByaWNlYCksDQogICI8YnI+TmV3IE93bmVyOiAiLCBzYWxlcy5ob29kLjk4dGguZ2VvJG5ldy5vd25lcg0KKQ0KDQoNCmxlYWZsZXQoKSAlPiUNCiAgc2V0VmlldyhsbmcgPSAtNzYuNiwgbGF0ID0gMzkuMywgem9vbSA9IDExKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkU3RhbWVuLlRvbmVyTGl0ZSkgJT4lIA0KICBhZGRQb2x5Z29ucyhkYXRhID0gaG9vZHMsIA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAyLCANCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICBvcGFjaXR5ID0gMC41LA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAsIA0KICAgICAgICAgICAgICBsYWJlbCA9IH5sYXBwbHkoaG9vZHMubGFiZWxzLCBIVE1MKSkgJT4lDQogIGFkZENpcmNsZU1hcmtlcnMoZGF0YSA9IHNhbGVzLmhvb2QuOTh0aC5nZW8sIA0KICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IDIsDQogICAgICAgICAgICAgICAgICAgbGFiZWwgPSB+bGFwcGx5KHNhbGUubGFiZWxzLCBIVE1MKSkNCmBgYA0KDQojIyBGdWxsIGxpc3QNCg0KYGBge3J9DQpzYWxlcy5ob29kLjk4dGggDQpgYGANCg0KIyBEZXRlY3QganVtcHMNCg0KYGBge3J9DQojbG9vayBmb3IgdGVtcG9yYWwganVtcHMgaW4gcHJpY2VzDQpgYGANCg0KIyA5OXRoIFBlcmNlbnRpbGUNCg0KIyMgQ3JpdGVyaWEgJiBSZXN1bHRzDQoNCmBgYHtyfQ0Kc2FsZXMuaG9vZC45OXRoIDwtIHNhbGVzICU+JQ0KICBsZWZ0X2pvaW4oc2FsZXMuc3VtbWFyeS4xNV8xNy5ieS5ob29kLA0KICAgICAgICAgICAgYnkgPSBjKCJuZWlnaGJvcmhvb2QiID0gIm5laWdoYm9yaG9vZCIpKSAlPiUNCiAgZmlsdGVyKHllYXIoZGVlZC5kYXRlKSA9PSAyMDE4LA0KICAgICAgICAgaG9vZC5uID49IDIwLA0KICAgICAgICAgYFNhbGVzIFByaWNlYCA+PSBob29kLjk5dGgsDQogICAgICAgICBgSG93IENvbnZleWVkYCA9PSAxLA0KICAgICAgICAgIWdyZXBsKCJOT1QiLCByZXNjb2RlKSkgJT4lDQogIGFycmFuZ2UobmVpZ2hib3Job29kKQ0KDQpyZXN1bHQuc2FsZXMgPC0gbnJvdyhzYWxlcy5ob29kLjk5dGgpDQpgYGANCg0KKipUaGVyZSBhcmUgYHIgcmVzdWx0LnNhbGVzYCBzYWxlcyB0aGF0IG1lZXQgdGhlIGZvbGxvd2luZyBjcml0ZXJpYToqKg0KDQotIERlZWQgZGF0ZSB3YXMgYmV0d2VlbiBKYW51YXJ5IDEsIDIwMTggYW5kIE9jdG9iZXIgNSwgMjAxOA0KLSBBcm1zLWxlbmd0aCBzYWxlDQotIFByaW5jaXBhbCByZXNpZGVuY2UNCi0gTmVpZ2hib3Job29kIGhhZCBhdCBsZWFzdCAyMCBzYWxlcw0KLSA5OXRoIHBlcmNlbnRpbGUgZm9yIHNhbGVzIHByaWNlcyBmb3IgdGhlaXIgbmVpZ2hib3Job29kLg0KDQooSWYgdGhpcyB5aWVsZCBpc24ndCBoaWdoIGVub3VnaCB3ZSBjYW4gYnVtcCBpdCBkb3duIHRvIHRoZSA5NXRoIHBlcmNlbnRpbGUuKQ0KDQoNCmBgYHtyfQ0Kc2FsZXMuaG9vZC45OXRoJGxvbmcgPC0gbGFwcGx5KHNhbGVzLmhvb2QuOTl0aCRsb2NhdGlvbi5jb29yZGluYXRlcywgZnVuY3Rpb24oeCkgeFsxXSkgJT4lIHVubGlzdCgpDQoNCnNhbGVzLmhvb2QuOTl0aCRsYXQgPC0gbGFwcGx5KHNhbGVzLmhvb2QuOTl0aCRsb2NhdGlvbi5jb29yZGluYXRlcywgZnVuY3Rpb24oeCkgeFsyXSkgJT4lIHVubGlzdCgpDQpgYGANCg0KDQpgYGB7cn0NCnNhbGVzLmhvb2QuOTl0aC5nZW8gPC0gc2FsZXMuaG9vZC45OXRoICU+JSBmaWx0ZXIoIWlzLm5hKGxvbmcpKQ0KICANCnNhbGVzLmhvb2QuOTl0aC5nZW8gPC0gU3BhdGlhbFBvaW50c0RhdGFGcmFtZSgNCiAgc2FsZXMuaG9vZC45OXRoLmdlbyAlPiUgc2VsZWN0KGxvbmcsIGxhdCksIA0KICBzYWxlcy5ob29kLjk5dGguZ2VvLA0KICBwcm9qNHN0cmluZyA9IENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK25vX2RlZnMgK2VsbHBzPVdHUzg0ICt0b3dnczg0PTAsMCwwIikpDQoNCnNhbGVzLmhvb2QuOTl0aC5nZW8gPC0gDQogIHNwVHJhbnNmb3JtKA0KICAgIHNhbGVzLmhvb2QuOTl0aC5nZW8sIA0KICAgIENSU29iaiA9IENSUygiK2luaXQ9ZXBzZzo0MzI2ICtwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0ICtub19kZWZzICtlbGxwcz1XR1M4NCArdG93Z3M4ND0wLDAsMCIpDQogICAgKQ0KDQpgYGANCg0KIyMgTWFwDQoNCmBgYHtyfQ0KDQoNCmhvb2RzLmxhYmVscyA8LSBwYXN0ZTAoDQogIGhvb2RzJGxhYmVsLA0KICAiPGJyPk1lZGlhbiBTYWxlcywgMjAxNS0yMDE3OiAiLCBhcy5jaGFyYWN0ZXIoaG9vZHMkaG9vZC5tZWRpYW4pDQogIA0KKQ0KDQpzYWxlLmxhYmVscyA8LSBwYXN0ZTAoDQogIHNhbGVzLmhvb2QuOTl0aC5nZW8kYEhvdXNlICNgLCAiICIsDQogIHNhbGVzLmhvb2QuOTl0aC5nZW8kYFN0cmVldCBOYW1lYCwgIiAiLA0KICBzYWxlcy5ob29kLjk5dGguZ2VvJFN1ZmZpeCwgDQogICI8YnI+U2FsZSBQcmljZSBpbiAyMDE4OiAiLCANCiAgYXMuY2hhcmFjdGVyKHNhbGVzLmhvb2QuOTl0aC5nZW8kYFNhbGVzIFByaWNlYCksDQogICI8YnI+TmV3IE93bmVyOiAiLCBzYWxlcy5ob29kLjk5dGguZ2VvJG5ldy5vd25lcg0KKQ0KDQoNCmxlYWZsZXQoKSAlPiUNCiAgc2V0VmlldyhsbmcgPSAtNzYuNiwgbGF0ID0gMzkuMywgem9vbSA9IDExKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkU3RhbWVuLlRvbmVyTGl0ZSkgJT4lIA0KICBhZGRQb2x5Z29ucyhkYXRhID0gaG9vZHMsIA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAyLCANCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICBvcGFjaXR5ID0gMC41LA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAsIA0KICAgICAgICAgICAgICBsYWJlbCA9IH5sYXBwbHkoaG9vZHMubGFiZWxzLCBIVE1MKSkgJT4lDQogIGFkZENpcmNsZU1hcmtlcnMoZGF0YSA9IHNhbGVzLmhvb2QuOTl0aC5nZW8sIA0KICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IDIsDQogICAgICAgICAgICAgICAgICAgbGFiZWwgPSB+bGFwcGx5KHNhbGUubGFiZWxzLCBIVE1MKSkNCmBgYA0KDQpgYGB7cn0NCmVtaWx5Lmxpc3QgPC0gYygiNDAxMSBCQVJSSU5HVE9OIiwNCiAgICAgICAgICAgICAgICAiRE9SQ0hFU1RFUiIsDQogICAgICAgICAgICAgICAgIjIzMTkgTU9OVElDRUxMTyIpDQoNCnNhbGVzLmhvb2QuOTh0aC5nZW9AZGF0YSAlPiUgDQogIGZpbHRlcihncmVwbChwYXN0ZShlbWlseS5saXN0LCBjb2xsYXBzZT0ifCIpLCBwcm9wZXJ0eWFkZHJlc3MpKQ0KYGBgDQoNCiMgSW4gTWlkZGxlIE5laWdoYm9yaG9vZCwgOTl0aCBQZXJjZW50aWxlIGZvciBOZWlnaGJvcmhvb2QsIE92ZXIgJDI1MGssIE92ZXIgJDEwayBQZXJtaXQgQWN0aXZpdHkNCg0KVGhlIGZvbGxvd2luZyBjcml0ZXJpYSBhcmUgdXNlZCBiZWxvdzoNCg0KLSBEZWVkIGRhdGUgd2FzIGJldHdlZW4gSmFudWFyeSAxLCAyMDE4IGFuZCBPY3RvYmVyIDUsIDIwMTgNCi0gQXJtcy1sZW5ndGggc2FsZQ0KLSBQcmluY2lwYWwgcmVzaWRlbmNlDQotIE5laWdoYm9yaG9vZCBoYWQgYXQgbGVhc3QgMjAgc2FsZXMNCi0gOTl0aCBwZXJjZW50aWxlIGZvciBzYWxlcyBwcmljZXMgZm9yIHRoZWlyIG5laWdoYm9yaG9vZC4NCi0gU2FsZSBwcmljZSBvdmVyICQyNTAsMDAwDQotIFBlcm1pdHMgaXNzdWVkIGJldHdlZW4gMjAxNy0yMDE4DQotIFRvdGFsIHBlcm1pdCB2YWx1ZSBhdCBsZWFzdCAkMTAsMDAwDQoNCmBgYHtyfQ0KcGVybWl0cy5yZWNlbnQgPC0gcGVybWl0cyAlPiUgDQogIGZpbHRlcihjc21faXNzdWVkX2RhdGUgPj0gIjIwMTctMDEtMDEiKSAlPiUNCiAgbXV0YXRlKHBlcm1pdC5ibG9jay5jbGVhbiA9IGdzdWIoIl4wKyIsICIiLCBwcmNfYmxvY2tfbm8pLA0KICAgICAgICAgcGVybWl0LmxvdC5jbGVhbiA9IGdzdWIoIl4wKyIsICIiLCBwcmNfbG90KSkNCg0KcGVybWl0cy5yZWNlbnQuc3VtbWFyeSA8LSBwZXJtaXRzLnJlY2VudCAlPiUNCiAgZ3JvdXBfYnkocGVybWl0LmJsb2NrLmNsZWFuLCBwZXJtaXQubG90LmNsZWFuKSAlPiUNCiAgc3VtbWFyaXNlKHBlcm1pdC5jb3VudCA9IG4oKSwNCiAgICAgICAgICAgIHBlcm1pdC50b3RhbC52YWx1ZSA9IHN1bShjc21fY29zdCwgbmEucm0gPSBUKSkNCmBgYA0KDQpgYGB7cn0NCm1pZC5ob29kcyA8LSBobXQuaG9vZCAlPiUgZmlsdGVyKGBQcmVkb21pbmFudCBDb2RlIElnbm9yaW5nIE5vbi1SZXNpZGVudGlhbGAgJWluJSBjKCJEIiwgIkUiLCAiRiIsICJHIiwgIkgiKSkNCg0Kc2FsZXMuOTl0aC5taWQuaG9vZCA8LSBzdWJzZXQoc2FsZXMuaG9vZC45OXRoLmdlbywgdG9sb3dlcihuZWlnaGJvcmhvb2QpICVpbiUgdG9sb3dlcihtaWQuaG9vZHMkTmVpZ2hib3Job29kKSkNCg0Kc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGsgPC0gc3Vic2V0KHNhbGVzLjk5dGgubWlkLmhvb2QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFNhbGVzIFByaWNlYCA+IDI1MDAwMCkNCmBgYA0KDQpgYGB7cn0NCnNhbGVzLjk5dGgubWlkLmhvb2Qub3Zlci4yNTBrQGRhdGEgJT4lIG5yb3cNCmBgYA0KDQoNCmBgYHtyfQ0Kc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGtAZGF0YSA8LSBzYWxlcy45OXRoLm1pZC5ob29kLm92ZXIuMjUwa0BkYXRhICU+JQ0KICBsZWZ0X2pvaW4ocGVybWl0cy5yZWNlbnQuc3VtbWFyeSwgDQogICAgICAgICAgICBieSA9IGMoInNhbGVzLmJsb2NrLmNsZWFuIiA9ICJwZXJtaXQuYmxvY2suY2xlYW4iLA0KICAgICAgICAgICAgICAgICAgICJzYWxlcy5sb3QuY2xlYW4iID0gInBlcm1pdC5sb3QuY2xlYW4iKSkNCmBgYA0KDQpGdXJ0aGVyIGZpbHRlciBmb3IgcGVybWl0IHZhbHVlIHRvdGFscyBvdmVyICQxMCwwMDAuDQoNCmBgYHtyfQ0Kc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGsuMTBrLnBlcm1pdCA8LSBzdWJzZXQoc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGssIHBlcm1pdC50b3RhbC52YWx1ZSA+PSAxMDAwMCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KYGBgDQoNClJlc3VsdHMgaW4gMjcgcHJvcGVydGllcy4NCg0KYGBge3J9DQpzYWxlcy45OXRoLm1pZC5ob29kLm92ZXIuMjUway4xMGsucGVybWl0QGRhdGEgJT4lIG5yb3cNCmBgYA0KDQoNCmBgYHtyIG91dC53aWR0aD0iMTAwJSIsIHdpZHRoID0gOH0NCg0KbWlkLmhvb2RzLmdlbyA8LSBzdWJzZXQoaG9vZHMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgdG9sb3dlcihsYWJlbCkgJWluJSB0b2xvd2VyKG1pZC5ob29kcyROZWlnaGJvcmhvb2QpKQ0KDQoNCg0KbWlkLmhvb2RzLmxhYmVscyA8LSBwYXN0ZTAoDQogIG1pZC5ob29kcy5nZW8kbGFiZWwsDQogICI8YnI+TWVkaWFuIFNhbGVzLCAyMDE1LTIwMTc6ICIsIGFzLmNoYXJhY3RlcihtaWQuaG9vZHMuZ2VvJGhvb2QubWVkaWFuKQ0KICANCikNCg0Kc2FsZS5sYWJlbHMgPC0gcGFzdGUwKA0KICAiQW5hbHlzaXM6IFNEQVQgKHRocm91Z2ggT2N0b2JlciAxOCk8YnI+IiwNCiAgc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGsuMTBrLnBlcm1pdCRgSG91c2UgI2AsICIgIiwNCiAgc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGsuMTBrLnBlcm1pdCRgU3RyZWV0IE5hbWVgLCAiICIsDQogIHNhbGVzLjk5dGgubWlkLmhvb2Qub3Zlci4yNTBrLjEway5wZXJtaXQkU3VmZml4LCANCiAgIjxicj5TYWxlIFByaWNlIGluIDIwMTg6ICIsIA0KICBhcy5jaGFyYWN0ZXIoc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGsuMTBrLnBlcm1pdCRgU2FsZXMgUHJpY2VgKSwNCiAgIjxicj5OZXcgT3duZXI6ICIsIHNhbGVzLjk5dGgubWlkLmhvb2Qub3Zlci4yNTBrLjEway5wZXJtaXQkbmV3Lm93bmVyLA0KICAiPGJyPlBlcm1pdHMgSXNzdWVkIGZyb20gMjAxNy0yMDE4OiAiLCBzYWxlcy45OXRoLm1pZC5ob29kLm92ZXIuMjUway4xMGsucGVybWl0JHBlcm1pdC5jb3VudCwNCiAgIjxicj5Ub3RhbCBQZXJtaXQgVmFsdWUgZnJvbSAyMDE3LTIwMTg6ICIsIHNhbGVzLjk5dGgubWlkLmhvb2Qub3Zlci4yNTBrLjEway5wZXJtaXQkcGVybWl0LnRvdGFsLnZhbHVlDQopDQoNCg0KbGVhZmxldCgpICU+JQ0KICBzZXRWaWV3KGxuZyA9IC03Ni42LCBsYXQgPSAzOS4zLCB6b29tID0gMTEpICU+JQ0KICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRTdGFtZW4uVG9uZXJMaXRlKSAlPiUgDQogIGFkZFBvbHlnb25zKGRhdGEgPSBob29kcywgDQogICAgICAgICAgICAgIHdlaWdodCA9IDIsIA0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICBvcGFjaXR5ID0gMC41LA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAsIA0KICAgICAgICAgICAgICBsYWJlbCA9IH5sYXBwbHkoaG9vZHMubGFiZWxzLCBIVE1MKSkgJT4lDQogIGFkZFBvbHlnb25zKGRhdGEgPSBtaWQuaG9vZHMuZ2VvLCANCiAgICAgICAgICAgICAgd2VpZ2h0ID0gMiwgDQogICAgICAgICAgICAgICNjb2xvciA9ICJibGFjayIsDQogICAgICAgICAgICAgIG9wYWNpdHkgPSAwLjAsDQogICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjIsDQogICAgICAgICAgICAgIGZpbGxDb2xvciA9IGl0ZWFtLmNvbG9yc1szXSwNCiAgICAgICAgICAgICAgbGFiZWwgPSB+bGFwcGx5KG1pZC5ob29kcy5sYWJlbHMsIEhUTUwpKSAlPiUNCiAgYWRkQ2lyY2xlTWFya2VycyhkYXRhID0gc2FsZXMuOTl0aC5taWQuaG9vZC5vdmVyLjI1MGsuMTBrLnBlcm1pdCwgDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSBpdGVhbS5jb2xvcnNbMV0sDQogICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsDQogICAgICAgICAgICAgICAgICAgcmFkaXVzID0gMiwNCiAgICAgICAgICAgICAgICAgICBsYWJlbCA9IH5sYXBwbHkoc2FsZS5sYWJlbHMsIEhUTUwpKQ0KYGBgDQoNCiMjIEZ1bGwgTGlzdA0KDQpgYGB7cn0NCnNhbGVzLjk5dGgubWlkLmhvb2Qub3Zlci4yNTBrLjEway5wZXJtaXRAZGF0YQ0KYGBgDQoNCiMgTVJJUyBkYXRhIE5vdiAyMDE4IC0gRmVicnVhcnkgMjAxOQ0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dtYXApDQpyZWdpc3Rlcl9nb29nbGUoU3lzLmdldGVudigiR09PR0xFX0dFT19LRVkiKSkNCmBgYA0KDQpgYGB7cn0NCmp1bGllLmxpc3QgPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9yYXcvc2FsZXMvTm92IDIwMTggLSBGZWIgMjAxOSBzYWxlcyBmb3IgSnVzdGluLnhsc3giLCBzaGVldCA9IDIpDQpgYGANCg0KYGBge3J9DQpqdWxpZS5saXN0DQpgYGANCg0KYGBge3J9DQpqdWxpZS5saXN0Lmdlb2NvZGVkIDwtIGp1bGllLmxpc3QgJT4lDQogIG11dGF0ZShmdWxsLmFkZHJlc3MgPSBwYXN0ZTAoQWRkcmVzcywgIiwgQmFsdGltb3JlLCBNRCwgIiwgWmlwX0NvZGUpKSAlPiUNCiAgbXV0YXRlX2dlb2NvZGUoZnVsbC5hZGRyZXNzKQ0KDQpqdWxpZS5saXN0Lmdlb2NvZGVkDQoNCmBgYA0KDQoNCmBgYHtyfQ0KbXJpcy5yZWNlbnQgJT4lIGdsaW1wc2UoKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCm1yaXMucmVjZW50Lm91dGxpZXJzIDwtIG1yaXMucmVjZW50ICU+JQ0KICBsZWZ0X2pvaW4oc2FsZXMuc3VtbWFyeS4xNV8xNy5ieS5ob29kLA0KICAgICAgICAgICAgYnkgPSBjKCJOZWlnaGJvcmhvb2QiID0gIm5laWdoYm9yaG9vZCIpKSAlPiUNCiAgZmlsdGVyKGhvb2QubiA+PSAyMCwNCiAgICAgICAgIENsb3NlX1ByaWNlID49IGhvb2QuOTl0aCkgJT4lDQogIGFycmFuZ2UoTmVpZ2hib3Job29kKSAlPiUNCiAgbXV0YXRlKGZ1bGwuYWRkcmVzcyA9IHBhc3RlMChBZGRyZXNzLCAiLCBCYWx0aW1vcmUsIE1ELCAiLCBaaXBfQ29kZSkpICU+JQ0KICBtdXRhdGVfZ2VvY29kZShmdWxsLmFkZHJlc3MpDQoNCnNhdmVSRFMobXJpcy5yZWNlbnQub3V0bGllcnMsICIuLi9kYXRhL3Byb2Nlc3NlZC9NUklTX291dGxpZXJzX2dlb2NvZGVkLnJkcyIpDQpgYGANCg0KYGBge3J9DQptcmlzLnNhbGUubGFiZWxzIDwtIHBhc3RlMCgNCiAgIkFuYWx5c2lzOiBNUklTIChOb3YgMTggLSBGZWIgMTkpPGJyPiIsDQogIG1yaXMucmVjZW50Lm91dGxpZXJzJEFkZHJlc3MsDQogICI8YnI+U2FsZSBQcmljZSBpbiAyMDE4OiAiLCANCiAgYXMuY2hhcmFjdGVyKG1yaXMucmVjZW50Lm91dGxpZXJzJENsb3NlX1ByaWNlKSwNCiAgIjxicj5SZWNlbnQgUmVub3ZhdGlvbjogIiwgbXJpcy5yZWNlbnQub3V0bGllcnMkWWVhcl9SZW5vdmF0ZWQNCikNCg0KanVsaWUubGlzdC5sYWJlbHMgPC0gcGFzdGUwKA0KICAiSnVsaWUvSnVzdGluIExpc3Q8YnI+IiwNCiAganVsaWUubGlzdC5nZW9jb2RlZCRBZGRyZXNzLA0KICAiPGJyPlNhbGUgUHJpY2UgaW4gMjAxODogIiwgDQogIGFzLmNoYXJhY3RlcihqdWxpZS5saXN0JENsb3NlX1ByaWNlKSwNCiAgIjxicj5SZWNlbnQgUmVub3ZhdGlvbjogIiwganVsaWUubGlzdCRZZWFyX1Jlbm92YXRlZA0KKQ0KDQoNCmxlYWZsZXQoKSAlPiUNCiAgc2V0VmlldyhsbmcgPSAtNzYuNiwgbGF0ID0gMzkuMywgem9vbSA9IDExKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkU3RhbWVuLlRvbmVyTGl0ZSkgJT4lIA0KICBhZGRQb2x5Z29ucyhkYXRhID0gaG9vZHMsIA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAyLCANCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgICBvcGFjaXR5ID0gMC41LA0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAsIA0KICAgICAgICAgICAgICBsYWJlbCA9IH5sYXBwbHkoaG9vZHMubGFiZWxzLCBIVE1MKSkgJT4lDQogIGFkZFBvbHlnb25zKGRhdGEgPSBtaWQuaG9vZHMuZ2VvLCANCiAgICAgICAgICAgICAgd2VpZ2h0ID0gMiwgDQogICAgICAgICAgICAgICNjb2xvciA9ICJibGFjayIsDQogICAgICAgICAgICAgIG9wYWNpdHkgPSAwLjAsDQogICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjIsDQogICAgICAgICAgICAgIGZpbGxDb2xvciA9IGl0ZWFtLmNvbG9yc1szXSwNCiAgICAgICAgICAgICAgbGFiZWwgPSB+bGFwcGx5KG1pZC5ob29kcy5sYWJlbHMsIEhUTUwpKSAlPiUNCiAgICAgIGFkZENpcmNsZU1hcmtlcnMoZGF0YSA9IGp1bGllLmxpc3QuZ2VvY29kZWQsDQoNCiAgICAgICAgICAgICAgICAgICBjb2xvciA9IGl0ZWFtLmNvbG9yc1szXSwNCiAgICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwNCiAgICAgICAgICAgICAgICAgICByYWRpdXMgPSAyLA0KICAgICAgICAgICAgICAgICAgIGxhYmVsID0gfmxhcHBseShqdWxpZS5saXN0LmxhYmVscywgSFRNTCkpICU+JQ0KICBhZGRDaXJjbGVNYXJrZXJzKGRhdGEgPSBtcmlzLnJlY2VudC5vdXRsaWVycywNCg0KICAgICAgICAgICAgICAgICAgIGNvbG9yID0gInJlZCIsDQogICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEsDQogICAgICAgICAgICAgICAgICAgcmFkaXVzID0gMiwNCiAgICAgICAgICAgICAgICAgICBsYWJlbCA9IH5sYXBwbHkobXJpcy5zYWxlLmxhYmVscywgSFRNTCkpICU+JQ0KICAgIGFkZENpcmNsZU1hcmtlcnMoZGF0YSA9IHNhbGVzLjk5dGgubWlkLmhvb2Qub3Zlci4yNTBrLjEway5wZXJtaXQsIA0KICAgICAgICAgICAgICAgICAgIGNvbG9yID0gaXRlYW0uY29sb3JzWzFdLA0KICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAxLA0KICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IDIsDQogICAgICAgICAgICAgICAgICAgbGFiZWwgPSB+bGFwcGx5KHNhbGUubGFiZWxzLCBIVE1MKSkgDQoNCmBgYA0KDQoNCg0KDQoNCg==